package com.atguigu.servlet;

import com.atguigu.dao.BookDao;
import com.atguigu.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;

/**
 * @author 伟哥
 * @date 2021-04-30 15:24
 */
@Controller
public class BookServlet {

    /**
     * 实验4：Autowired使用
     *
     *      Autowired：获取被Autowired注解的类，它的类型，去ioc容器内匹配
     *                 找到一个，直接注入。
     *                 找到多个，再按照变量名进行注入
     *                      按照变量名，没找到，报错
     *                 没找到，报错
     *
     *      Qualifier：用于，Autowired按类型，
     *                 找到多个bean的时候，按照Qualifier内的值进行注入
     *
     *      Autowired(required = false)：此值默认为true（不写也是true），也就是说Spring一定会注入，无法注入则报错
     *                                   改为false，无法注入的时候，不会报错，并且注入null值
     */
    @Qualifier("bookServiceExt123456")
    @Autowired(required = false)
    private BookService bookService;

    public void doGet(){
        System.out.println(bookService);
        //bookService.save();
    }

    /**
     * 实验5：给方法上、参数上使用@Autowired注解
     *      1）、这个方法会在bean创建的时候【自动运行】
     *      2）、这个方法的【每一个参数都会自动注入值】
     *
     *      public void hahah(BookDao bookDao,BookService bookService){
     *          注意看 BookService，此时ioc容器内有2个BookService类（bookService、bookServiceExt（继承bookService））
     *          Autowired的装配逻辑，是按照参数名bookService，去匹配bookService
     *          此时，可以在参数上使用@Qualifier("bookServiceExt")，去指定装配bookServiceExt
     */
    @Autowired(required = false)
    public void hahah(BookDao bookDao,@Qualifier("bookServiceExt") BookService bookService){
        // 1、这个方法hahah会在bean创建的时候自动运行
        System.out.println("Spring运行了方法");

        // 2、打印注入的类
        System.out.println("自动注入："+bookDao+";;;"+bookService);
    }
}
